load

library(tidyverse)
library(lubridate)
library(forecast)
library(ggrepel)
library(rvest)
library(plotly)
library(xtable)
dja <- read_csv("data/DJA.csv",skip = 4)
gold <- read_csv("data/GOLD_1791-2018.csv",skip = 3)
interest_rate <- read_csv("data/INTERESTRATE_1857-2018.csv",skip = 1)
sap <- read_csv("data/SAP_1871-2018.csv", skip=1)
cpi <- read_csv("data/USCPI_1774-2018.csv", skip=4)
gdp <- read_csv("data/USGDP_1790-2018.csv", skip=2)
wage <- read_csv("data/USWAGE_1774-2018.csv", skip=3)

Down Jones Avg

el dja es una serie diaria, todas las demás son anuales.

dja <- dja %>% 
  mutate(Date = parse_date_time(Date,orders = "mdy"))
ggplotly(ggplot(dja,aes(Date, DJIA))+
  geom_line()) %>% 
  layout(legend = list(
      orientation = "h"))

summary(dja)
      Date                          DJIA         
 Min.   :1885-05-02 00:00:00   Min.   :   24.36  
 1st Qu.:1916-02-09 06:00:00   1st Qu.:   70.41  
 Median :1946-10-14 12:00:00   Median :  199.28  
 Mean   :1949-03-11 07:36:39   Mean   : 2354.03  
 3rd Qu.:1982-06-06 06:00:00   3rd Qu.: 1002.07  
 Max.   :2018-09-10 00:00:00   Max.   :26616.71  
dja %>% 
  mutate(dif = (DJIA - lag(DJIA, default = DJIA[1]))/lag(DJIA, default = DJIA[1])) %>% 
ggplot(.,aes(Date, dif))+
  geom_rect(fill="firebrick", 
            xmin=parse_date_time("01-01-1930",orders = "mdy"),
            xmax=parse_date_time("01-01-1940",orders = "mdy"),
            ymin=-1,
            ymax=1,
            alpha=0.5)+
    geom_line()

armo una lista de las crisis conocidas

Crisis

url <- "https://www.caproasia.com/2016/04/12/economic-crisis-since-1900-2015/"
crisis <- url %>%
  read_html() %>% 
  html_nodes(css = 'table') %>% 
  html_table(header = T)
crisis <- crisis[[1]] %>% 
  filter(Affected %in% c("United States","Global")) %>% 
  separate(Period,c("desde","hasta")," – ")
Expected 2 pieces. Missing pieces filled with `NA` in 10 rows [1, 4, 5, 6, 7, 8, 9, 10, 11, 12].
#en realidad las que terminan en "s" no duran toda la década. Las agrego a mano.
  # mutate(hasta = parse_date_time(case_when(grepl("s",desde)~as.numeric(str_extract(desde,"[[:digit:]]*"))+10,
  #                          TRUE~ as.numeric(hasta)),"y"),
  #        desde = parse_date_time(str_extract(desde,"[[:digit:]]*"),"y"))
crisis <- crisis %>% 
  mutate(hasta = parse_date_time(case_when(desde=="1970s"~"1979",
                           desde=="1980s"~"1982",
                           desde == "1990s"~"1991",
                           TRUE~hasta),"y"),
         desde = parse_date_time(case_when(desde=="1970s"~"1973",
                           desde=="1980s"~"1981",
                           desde=="1990s"~"1990",
                           TRUE~desde),"y"))
# tabla <- crisis[[1]] %>% 
#   filter(Affected %in% c("United States","Global")) %>% 
#   select(-Region, - Affected) %>% 
#   xtable(.)
#En la consola
# print(tabla, include.rownames = F)
crisis_largas <- na.omit(crisis)
crisis_puntuales <- crisis %>% 
  filter(is.na(hasta))
dja <- dja %>% 
  mutate(dif = (DJIA - lag(DJIA, default = DJIA[1]))/lag(DJIA, default = DJIA[1])) 
ggplot()+
  geom_rect(data= crisis_largas, 
            aes(xmin=crisis_largas$desde,
            xmax=crisis_largas$hasta),
            fill="firebrick", 
            ymin=-1,
            ymax=1,
            alpha=0.5)+
    geom_line(data = dja,aes(Date, dif))+
  geom_vline(data=crisis_puntuales, aes(xintercept=desde), color = "red", linetype="dashed")

NA

Este gráfico me da la sensación de que todo estuviera corrido a la derecha (mirando las crisis puntuales vs los picos)

Gold

gold %>% 
  ggplot(., aes(Year, `New York Market Price (U.S. dollars per fine ounce)`))+
  geom_line(size=1)+
  geom_vline(xintercept = 1971, color = "red")+
  geom_label_repel(data=data_frame(),aes(x=1971,y=1000,label="Fin del patrón oro"),nudge_x = -5,force=10,size=7)+
  theme_minimal()+
  labs(y="Dólares por onza de oro", x="Año")+
  theme(text = element_text(size = 20))
ggsave("plots/oro.png", dpi=300, width = 10, height = 7, scale=1)

interest_rate

graf <- interest_rate %>% 
  gather(type,rate,2:4) %>% 
  ggplot(., aes(Year,rate,color=type))+
  geom_line()+
  guides(color=guide_legend(nrow=2,byrow=TRUE))+
  theme(legend.position = "bottom")
ggplotly(graf) %>%
  layout(legend = list(
      orientation = "h"
    )
  )
  • La tasa de largo plazo es una serie mucho más suave (eso es un dato conocido de finanzas no?)
  • Los surplus funds también parecen ser más volátiles hasta los 40

sap

sap %>% 
  summary()
      Year      The S&P Index Average for January  Annual Yield  
 Min.   :1871   Min.   :   3.240                  Min.   :1.140  
 1st Qu.:1908   1st Qu.:   7.433                  1st Qu.:3.310  
 Median :1944   Median :  16.430                  Median :4.500  
 Mean   :1944   Mean   : 261.888                  Mean   :4.356  
 3rd Qu.:1981   3rd Qu.: 122.058                  3rd Qu.:5.390  
 Max.   :2018   Max.   :2791.730                  Max.   :8.710  
                                                  NA's   :1      
 The Accumulated S&P Index Average for January
 Min.   :     1.0                             
 1st Qu.:    11.5                             
 Median :   122.0                             
 Mean   : 21442.8                             
 3rd Qu.:  5360.0                             
 Max.   :298189.7                             
                                              
sap %>% 
  gather(type, value,2:4) %>%
  mutate(type= case_when(type=="The S&P Index Average for January"~"The S&P Index\nAverage for January",
                         type=="The Accumulated S&P Index Average for January"~"The Accumulated S&P\nIndex Average for January",
                         TRUE~type)) %>% 
  ggplot(.,aes(Year,value, color=type))+
  geom_line()+
  facet_grid(type~.,scale="free")+
  theme(legend.position = "bottom",
        strip.text.y = element_text(angle = 0))

ts(sap$`Annual Yield`, start=min(sap$Year), frequency = 1) %>% 
  na.omit() %>%
  auto.arima(.)
Series: . 
ARIMA(0,1,2) 

Coefficients:
          ma1      ma2
      -0.0141  -0.3007
s.e.   0.0802   0.0810

sigma^2 estimated as 0.4111:  log likelihood=-141.37
AIC=288.73   AICc=288.9   BIC=297.68

CPI

cpi %>% 
  ggplot(., aes(Year, `U.S. Consumer Price Index *`))+
  geom_line(size=1)+
  geom_vline(xintercept = 1971, color = "red")+
  geom_label_repel(data=data_frame(),aes(x=1971,y=100,label="Fin del patrón oro"),nudge_x = -5,force=10,size=7)+
  theme_minimal()+
  labs(y="IPC", x="Año")+
  theme(text = element_text(size = 20))
ggsave("plots/cpi_orig.png", scale = 1)
Saving 7.29 x 4.5 in image

gdp

gdp %>% 
  ggplot(., aes(Year, `Real GDP (millions of 2012 dollars)`))+
  geom_line(size=1)+
  # geom_vline(xintercept = 1971, color = "red")+
  # geom_label_repel(data=data_frame(),aes(x=1971,y=100,label="Fin del patrón oro"),nudge_x = -5,force=10,size=7)+
  theme_minimal()+
  labs(y="Real GDP", x="Año")+
  theme(text = element_text(size = 30))
ggsave("plots/PBI.png", scale = 1)
Saving 7.29 x 4.5 in image

me interesa ver el PBI normalizado por el crecimiento poblacional, y además normalizado por la cantidad de oro que puede comprar (en lugar de normalizar por el CPI):

gdp <- left_join(gold, gdp, by = "Year") %>% 
  mutate(gdp_in_gold = `Nominal GDP per capita (current dollars)`/`New York Market Price (U.S. dollars per fine ounce)`,
         Year = parse_date_time(Year,"y")) 
  
ggplotly(ggplot(gdp,aes(Year,gdp_in_gold))+
  geom_line())

A partir del 1900 pareciera que se arman 3 ciclos muy largos

  • 1914-1933
  • 1933-1980
  • 1980-2012

Agregando referencias históricas de las crisis conocidas

library(scales) # to access breaks/formatting functions
ggplot()+
geom_rect(data= crisis_largas, 
            aes(xmin=crisis_largas$desde,
            xmax=crisis_largas$hasta),
            fill="firebrick", 
            ymin=-Inf,
            ymax=Inf,
            alpha=0.5)+
  geom_line(size=1,
    data = gdp %>% 
              filter(Year>parse_date_time(1900,"y"))
            ,aes(Year, gdp_in_gold))+
  geom_vline(data=crisis_puntuales, aes(xintercept=desde), color = "red", linetype="dashed")+
  geom_vline(xintercept = parse_date_time(1971,"y"),color = "gold")+ #fin del patron oro
  scale_x_datetime(date_breaks = "15 years",labels = date_format("%Y") )+  
  theme_minimal()
ggsave("plots/gdp_in_gold_eda.PNG", dpi = 300, width = 10,height = 6)

La guerra de sesesión de EEUU fué entre el 12 de abril de 1861 y el 9 de abril de 1865

A partir de ahí el pbi en oro crece hasta el fin del patron oro.

wage

wage %>% 
  summary()
      Year      Costs of Unskilled Labor (index 1860 = 100)
 Min.   :1774   Min.   :   31.00                           
 1st Qu.:1835   1st Qu.:   79.65                           
 Median :1896   Median :  143.50                           
 Mean   :1896   Mean   : 2499.49                           
 3rd Qu.:1956   3rd Qu.: 1682.75                           
 Max.   :2017   Max.   :19640.40                           
                                                           
 Production Workers Hourly Compensation (nominal dollars)
 Min.   : 0.020                                          
 1st Qu.: 0.060                                          
 Median : 0.150                                          
 Mean   : 3.906                                          
 3rd Qu.: 2.555                                          
 Max.   :32.390                                          
 NA's   :16                                              

Podemos deflactar el salario horario por el CPI

ggplotly(
wage %>% 
  left_join(cpi,by="Year") %>% 
  na.omit() %>% 
  mutate(salario_horario_real = `Production Workers Hourly Compensation (nominal dollars)`/`U.S. Consumer Price Index *`) %>% 
  ggplot(.,aes(Year,salario_horario_real))+
  geom_line() 
  )

El salario real tiene una tendencia creciente hasta el 78’ y allí se estanca hasta el 2013

wg_gold <- wage %>% 
  filter(Year>=1900) %>% 
  left_join(gold, gdp, by = "Year") %>% 
  mutate(wg_in_gold = `Production Workers Hourly Compensation (nominal dollars)`/`New York Market Price (U.S. dollars per fine ounce)`,
         Year = parse_date_time(Year,"y")) %>% 
  na.omit()  
ggplot()+
geom_rect(data= crisis_largas, 
            aes(xmin=crisis_largas$desde,
            xmax=crisis_largas$hasta),
            fill="firebrick", 
            ymin=-Inf,
            ymax=Inf,
            alpha=0.5)+
  geom_line(size=1,data = wg_gold, aes(Year, wg_in_gold))+
  geom_vline(data=crisis_puntuales, aes(xintercept=desde), color = "red", linetype="dashed")+
  geom_vline(xintercept = parse_date_time(1971,"y"),color = "gold")+ #fin del patron oro
  scale_x_datetime(date_breaks = "15 years",labels = date_format("%Y") )+
  theme_minimal()
ggsave("plots/wg_in_gold_eda.PNG", dpi = 300, width = 10,height = 6)

Se ven los mismos tres períodos. Pero a diferencia del GDP, el período 1980-2012 tiene un nivel más bajo que el anterior.

¿ Si quisieramos comparar ingrsos con algún revenue tendríamos usar S&P o DJA?

LS0tCnRpdGxlOiAiRXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyMgbG9hZAoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShmb3JlY2FzdCkKbGlicmFyeShnZ3JlcGVsKQpsaWJyYXJ5KHJ2ZXN0KQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeSh4dGFibGUpCmBgYAoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQpkamEgPC0gcmVhZF9jc3YoImRhdGEvREpBLmNzdiIsc2tpcCA9IDQpCmdvbGQgPC0gcmVhZF9jc3YoImRhdGEvR09MRF8xNzkxLTIwMTguY3N2Iixza2lwID0gMykKaW50ZXJlc3RfcmF0ZSA8LSByZWFkX2NzdigiZGF0YS9JTlRFUkVTVFJBVEVfMTg1Ny0yMDE4LmNzdiIsc2tpcCA9IDEpCnNhcCA8LSByZWFkX2NzdigiZGF0YS9TQVBfMTg3MS0yMDE4LmNzdiIsIHNraXA9MSkKY3BpIDwtIHJlYWRfY3N2KCJkYXRhL1VTQ1BJXzE3NzQtMjAxOC5jc3YiLCBza2lwPTQpCmdkcCA8LSByZWFkX2NzdigiZGF0YS9VU0dEUF8xNzkwLTIwMTguY3N2Iiwgc2tpcD0yKQp3YWdlIDwtIHJlYWRfY3N2KCJkYXRhL1VTV0FHRV8xNzc0LTIwMTguY3N2Iiwgc2tpcD0zKQpgYGAKCgojIyBEb3duIEpvbmVzIEF2ZwplbCBkamEgZXMgdW5hIHNlcmllIGRpYXJpYSwgdG9kYXMgbGFzIGRlbcOhcyBzb24gYW51YWxlcy4KCmBgYHtyfQpkamEgPC0gZGphICU+JSAKICBtdXRhdGUoRGF0ZSA9IHBhcnNlX2RhdGVfdGltZShEYXRlLG9yZGVycyA9ICJtZHkiKSkKCmdncGxvdGx5KGdncGxvdChkamEsYWVzKERhdGUsIERKSUEpKSsKICBnZW9tX2xpbmUoKSkgJT4lIAogIGxheW91dChsZWdlbmQgPSBsaXN0KAogICAgICBvcmllbnRhdGlvbiA9ICJoIikpCgpzdW1tYXJ5KGRqYSkKYGBgCgoKYGBge3J9CgpkamEgJT4lIAogIG11dGF0ZShkaWYgPSAoREpJQSAtIGxhZyhESklBLCBkZWZhdWx0ID0gREpJQVsxXSkpL2xhZyhESklBLCBkZWZhdWx0ID0gREpJQVsxXSkpICU+JSAKZ2dwbG90KC4sYWVzKERhdGUsIGRpZikpKwogIGdlb21fcmVjdChmaWxsPSJmaXJlYnJpY2siLCAKICAgICAgICAgICAgeG1pbj1wYXJzZV9kYXRlX3RpbWUoIjAxLTAxLTE5MzAiLG9yZGVycyA9ICJtZHkiKSwKICAgICAgICAgICAgeG1heD1wYXJzZV9kYXRlX3RpbWUoIjAxLTAxLTE5NDAiLG9yZGVycyA9ICJtZHkiKSwKICAgICAgICAgICAgeW1pbj0tMSwKICAgICAgICAgICAgeW1heD0xLAogICAgICAgICAgICBhbHBoYT0wLjUpKwogICAgZ2VvbV9saW5lKCkKCmBgYAoKYXJtbyB1bmEgbGlzdGEgZGUgbGFzIGNyaXNpcyBjb25vY2lkYXMKCiMgQ3Jpc2lzCgpgYGB7cn0KdXJsIDwtICJodHRwczovL3d3dy5jYXByb2FzaWEuY29tLzIwMTYvMDQvMTIvZWNvbm9taWMtY3Jpc2lzLXNpbmNlLTE5MDAtMjAxNS8iCmNyaXNpcyA8LSB1cmwgJT4lCiAgcmVhZF9odG1sKCkgJT4lIAogIGh0bWxfbm9kZXMoY3NzID0gJ3RhYmxlJykgJT4lIAogIGh0bWxfdGFibGUoaGVhZGVyID0gVCkKCmNyaXNpcyA8LSBjcmlzaXNbWzFdXSAlPiUgCiAgZmlsdGVyKEFmZmVjdGVkICVpbiUgYygiVW5pdGVkIFN0YXRlcyIsIkdsb2JhbCIpKSAlPiUgCiAgc2VwYXJhdGUoUGVyaW9kLGMoImRlc2RlIiwiaGFzdGEiKSwiIOKAkyAiKQoKCiNlbiByZWFsaWRhZCBsYXMgcXVlIHRlcm1pbmFuIGVuICJzIiBubyBkdXJhbiB0b2RhIGxhIGTDqWNhZGEuIExhcyBhZ3JlZ28gYSBtYW5vLgogICMgbXV0YXRlKGhhc3RhID0gcGFyc2VfZGF0ZV90aW1lKGNhc2Vfd2hlbihncmVwbCgicyIsZGVzZGUpfmFzLm51bWVyaWMoc3RyX2V4dHJhY3QoZGVzZGUsIltbOmRpZ2l0Ol1dKiIpKSsxMCwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFfiBhcy5udW1lcmljKGhhc3RhKSksInkiKSwKICAjICAgICAgICBkZXNkZSA9IHBhcnNlX2RhdGVfdGltZShzdHJfZXh0cmFjdChkZXNkZSwiW1s6ZGlnaXQ6XV0qIiksInkiKSkKCmNyaXNpcyA8LSBjcmlzaXMgJT4lIAogIG11dGF0ZShoYXN0YSA9IHBhcnNlX2RhdGVfdGltZShjYXNlX3doZW4oZGVzZGU9PSIxOTcwcyJ+IjE5NzkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNkZT09IjE5ODBzIn4iMTk4MiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2RlID09ICIxOTkwcyJ+IjE5OTEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFfmhhc3RhKSwieSIpLAogICAgICAgICBkZXNkZSA9IHBhcnNlX2RhdGVfdGltZShjYXNlX3doZW4oZGVzZGU9PSIxOTcwcyJ+IjE5NzMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNkZT09IjE5ODBzIn4iMTk4MSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2RlPT0iMTk5MHMifiIxOTkwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRX5kZXNkZSksInkiKSkKCgpgYGAKCgpgYGB7cn0KIyB0YWJsYSA8LSBjcmlzaXNbWzFdXSAlPiUgCiMgICBmaWx0ZXIoQWZmZWN0ZWQgJWluJSBjKCJVbml0ZWQgU3RhdGVzIiwiR2xvYmFsIikpICU+JSAKIyAgIHNlbGVjdCgtUmVnaW9uLCAtIEFmZmVjdGVkKSAlPiUgCiMgICB4dGFibGUoLikKCiNFbiBsYSBjb25zb2xhCiMgcHJpbnQodGFibGEsIGluY2x1ZGUucm93bmFtZXMgPSBGKQoKYGBgCgoKYGBge3J9CmNyaXNpc19sYXJnYXMgPC0gbmEub21pdChjcmlzaXMpCmNyaXNpc19wdW50dWFsZXMgPC0gY3Jpc2lzICU+JSAKICBmaWx0ZXIoaXMubmEoaGFzdGEpKQoKCmRqYSA8LSBkamEgJT4lIAogIG11dGF0ZShkaWYgPSAoREpJQSAtIGxhZyhESklBLCBkZWZhdWx0ID0gREpJQVsxXSkpL2xhZyhESklBLCBkZWZhdWx0ID0gREpJQVsxXSkpIApnZ3Bsb3QoKSsKICBnZW9tX3JlY3QoZGF0YT0gY3Jpc2lzX2xhcmdhcywgCiAgICAgICAgICAgIGFlcyh4bWluPWNyaXNpc19sYXJnYXMkZGVzZGUsCiAgICAgICAgICAgIHhtYXg9Y3Jpc2lzX2xhcmdhcyRoYXN0YSksCiAgICAgICAgICAgIGZpbGw9ImZpcmVicmljayIsIAogICAgICAgICAgICB5bWluPS0xLAogICAgICAgICAgICB5bWF4PTEsCiAgICAgICAgICAgIGFscGhhPTAuNSkrCiAgICBnZW9tX2xpbmUoZGF0YSA9IGRqYSxhZXMoRGF0ZSwgZGlmKSkrCiAgZ2VvbV92bGluZShkYXRhPWNyaXNpc19wdW50dWFsZXMsIGFlcyh4aW50ZXJjZXB0PWRlc2RlKSwgY29sb3IgPSAicmVkIiwgbGluZXR5cGU9ImRhc2hlZCIpCiAgCgpgYGAKCgpFc3RlIGdyw6FmaWNvIG1lIGRhIGxhIHNlbnNhY2nDs24gZGUgcXVlIHRvZG8gZXN0dXZpZXJhIGNvcnJpZG8gYSBsYSBkZXJlY2hhIChtaXJhbmRvIGxhcyBjcmlzaXMgcHVudHVhbGVzIHZzIGxvcyBwaWNvcykKCiMjIEdvbGQKCmBgYHtyfQpnb2xkICU+JSAKICBnZ3Bsb3QoLiwgYWVzKFllYXIsIGBOZXcgWW9yayBNYXJrZXQgUHJpY2UgKFUuUy4gZG9sbGFycyBwZXIgZmluZSBvdW5jZSlgKSkrCiAgZ2VvbV9saW5lKHNpemU9MSkrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTk3MSwgY29sb3IgPSAicmVkIikrCiAgZ2VvbV9sYWJlbF9yZXBlbChkYXRhPWRhdGFfZnJhbWUoKSxhZXMoeD0xOTcxLHk9MTAwMCxsYWJlbD0iRmluIGRlbCBwYXRyw7NuIG9ybyIpLG51ZGdlX3ggPSAtNSxmb3JjZT0xMCxzaXplPTcpKwogIHRoZW1lX21pbmltYWwoKSsKICBsYWJzKHk9IkTDs2xhcmVzIHBvciBvbnphIGRlIG9ybyIsIHg9IkHDsW8iKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkpCgpnZ3NhdmUoInBsb3RzL29yby5wbmciLCBkcGk9MzAwLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA3LCBzY2FsZT0xKQpgYGAKCgojIyBpbnRlcmVzdF9yYXRlCgoKYGBge3J9CmdyYWYgPC0gaW50ZXJlc3RfcmF0ZSAlPiUgCiAgZ2F0aGVyKHR5cGUscmF0ZSwyOjQpICU+JSAKICBnZ3Bsb3QoLiwgYWVzKFllYXIscmF0ZSxjb2xvcj10eXBlKSkrCiAgZ2VvbV9saW5lKCkrCiAgZ3VpZGVzKGNvbG9yPWd1aWRlX2xlZ2VuZChucm93PTIsYnlyb3c9VFJVRSkpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQpnZ3Bsb3RseShncmFmKSAlPiUKICBsYXlvdXQobGVnZW5kID0gbGlzdCgKICAgICAgb3JpZW50YXRpb24gPSAiaCIKICAgICkKICApCmBgYAoKLSBMYSB0YXNhIGRlIGxhcmdvIHBsYXpvIGVzIHVuYSBzZXJpZSBtdWNobyBtw6FzIHN1YXZlIChlc28gZXMgdW4gZGF0byBjb25vY2lkbyBkZSBmaW5hbnphcyBubz8pCi0gTG9zIHN1cnBsdXMgZnVuZHMgdGFtYmnDqW4gcGFyZWNlbiBzZXIgbcOhcyB2b2zDoXRpbGVzIGhhc3RhIGxvcyA0MAoKCiMjIHNhcAoKCmBgYHtyfQpzYXAgJT4lIAogIHN1bW1hcnkoKQpzYXAgJT4lIAogIGdhdGhlcih0eXBlLCB2YWx1ZSwyOjQpICU+JQogIG11dGF0ZSh0eXBlPSBjYXNlX3doZW4odHlwZT09IlRoZSBTJlAgSW5kZXggQXZlcmFnZSBmb3IgSmFudWFyeSJ+IlRoZSBTJlAgSW5kZXhcbkF2ZXJhZ2UgZm9yIEphbnVhcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT09IlRoZSBBY2N1bXVsYXRlZCBTJlAgSW5kZXggQXZlcmFnZSBmb3IgSmFudWFyeSJ+IlRoZSBBY2N1bXVsYXRlZCBTJlBcbkluZGV4IEF2ZXJhZ2UgZm9yIEphbnVhcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgVFJVRX50eXBlKSkgJT4lIAogIGdncGxvdCguLGFlcyhZZWFyLHZhbHVlLCBjb2xvcj10eXBlKSkrCiAgZ2VvbV9saW5lKCkrCiAgZmFjZXRfZ3JpZCh0eXBlfi4sc2NhbGU9ImZyZWUiKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwKSkKCmBgYAoKCgpgYGB7cn0KdHMoc2FwJGBBbm51YWwgWWllbGRgLCBzdGFydD1taW4oc2FwJFllYXIpLCBmcmVxdWVuY3kgPSAxKSAlPiUgCiAgbmEub21pdCgpICU+JQogIGF1dG8uYXJpbWEoLikKCmBgYAoKIyMgQ1BJCgpgYGB7cn0KCmNwaSAlPiUgCiAgZ2dwbG90KC4sIGFlcyhZZWFyLCBgVS5TLiBDb25zdW1lciBQcmljZSBJbmRleCAqYCkpKwogIGdlb21fbGluZShzaXplPTEpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDE5NzEsIGNvbG9yID0gInJlZCIpKwogIGdlb21fbGFiZWxfcmVwZWwoZGF0YT1kYXRhX2ZyYW1lKCksYWVzKHg9MTk3MSx5PTEwMCxsYWJlbD0iRmluIGRlbCBwYXRyw7NuIG9ybyIpLG51ZGdlX3ggPSAtNSxmb3JjZT0xMCxzaXplPTcpKwogIHRoZW1lX21pbmltYWwoKSsKICBsYWJzKHk9IklQQyIsIHg9IkHDsW8iKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkpCgpnZ3NhdmUoInBsb3RzL2NwaV9vcmlnLnBuZyIsIHNjYWxlID0gMSkKYGBgCgojIyBnZHAKYGBge3J9CmdkcCAlPiUgCiAgZ2dwbG90KC4sIGFlcyhZZWFyLCBgUmVhbCBHRFAgKG1pbGxpb25zIG9mIDIwMTIgZG9sbGFycylgKSkrCiAgZ2VvbV9saW5lKHNpemU9MSkrCiAgIyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxOTcxLCBjb2xvciA9ICJyZWQiKSsKICAjIGdlb21fbGFiZWxfcmVwZWwoZGF0YT1kYXRhX2ZyYW1lKCksYWVzKHg9MTk3MSx5PTEwMCxsYWJlbD0iRmluIGRlbCBwYXRyw7NuIG9ybyIpLG51ZGdlX3ggPSAtNSxmb3JjZT0xMCxzaXplPTcpKwogIHRoZW1lX21pbmltYWwoKSsKICBsYWJzKHk9IlJlYWwgR0RQIiwgeD0iQcOxbyIpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDMwKSkKCmdnc2F2ZSgicGxvdHMvUEJJLnBuZyIsIHNjYWxlID0gMSkKCmBgYAoKCgptZSBpbnRlcmVzYSB2ZXIgZWwgUEJJIG5vcm1hbGl6YWRvIHBvciBlbCBjcmVjaW1pZW50byBwb2JsYWNpb25hbCwgeSBhZGVtw6FzIG5vcm1hbGl6YWRvIHBvciBsYSBjYW50aWRhZCBkZSBvcm8gcXVlIHB1ZWRlIGNvbXByYXIgKGVuIGx1Z2FyIGRlIG5vcm1hbGl6YXIgcG9yIGVsIENQSSk6CgpgYGB7cn0KCgpnZHAgPC0gbGVmdF9qb2luKGdvbGQsIGdkcCwgYnkgPSAiWWVhciIpICU+JSAKICBtdXRhdGUoZ2RwX2luX2dvbGQgPSBgTm9taW5hbCBHRFAgcGVyIGNhcGl0YSAoY3VycmVudCBkb2xsYXJzKWAvYE5ldyBZb3JrIE1hcmtldCBQcmljZSAoVS5TLiBkb2xsYXJzIHBlciBmaW5lIG91bmNlKWAsCiAgICAgICAgIFllYXIgPSBwYXJzZV9kYXRlX3RpbWUoWWVhciwieSIpKSAKICAKZ2dwbG90bHkoZ2dwbG90KGdkcCxhZXMoWWVhcixnZHBfaW5fZ29sZCkpKwogIGdlb21fbGluZSgpKQpgYGAKCkEgcGFydGlyIGRlbCAxOTAwIHBhcmVjaWVyYSBxdWUgc2UgYXJtYW4gMyBjaWNsb3MgbXV5IGxhcmdvcwoKLSAxOTE0LTE5MzMKLSAxOTMzLTE5ODAKLSAxOTgwLTIwMTIKCgpBZ3JlZ2FuZG8gcmVmZXJlbmNpYXMgaGlzdMOzcmljYXMgZGUgbGFzIGNyaXNpcyBjb25vY2lkYXMKCmBgYHtyfQpsaWJyYXJ5KHNjYWxlcykgIyB0byBhY2Nlc3MgYnJlYWtzL2Zvcm1hdHRpbmcgZnVuY3Rpb25zCmdncGxvdCgpKwpnZW9tX3JlY3QoZGF0YT0gY3Jpc2lzX2xhcmdhcywgCiAgICAgICAgICAgIGFlcyh4bWluPWNyaXNpc19sYXJnYXMkZGVzZGUsCiAgICAgICAgICAgIHhtYXg9Y3Jpc2lzX2xhcmdhcyRoYXN0YSksCiAgICAgICAgICAgIGZpbGw9ImZpcmVicmljayIsIAogICAgICAgICAgICB5bWluPS1JbmYsCiAgICAgICAgICAgIHltYXg9SW5mLAogICAgICAgICAgICBhbHBoYT0wLjUpKwogIGdlb21fbGluZShzaXplPTEsCiAgICBkYXRhID0gZ2RwICU+JSAKICAgICAgICAgICAgICBmaWx0ZXIoWWVhcj5wYXJzZV9kYXRlX3RpbWUoMTkwMCwieSIpKQogICAgICAgICAgICAsYWVzKFllYXIsIGdkcF9pbl9nb2xkKSkrCiAgZ2VvbV92bGluZShkYXRhPWNyaXNpc19wdW50dWFsZXMsIGFlcyh4aW50ZXJjZXB0PWRlc2RlKSwgY29sb3IgPSAicmVkIiwgbGluZXR5cGU9ImRhc2hlZCIpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IHBhcnNlX2RhdGVfdGltZSgxOTcxLCJ5IiksY29sb3IgPSAiZ29sZCIpKyAjZmluIGRlbCBwYXRyb24gb3JvCiAgc2NhbGVfeF9kYXRldGltZShkYXRlX2JyZWFrcyA9ICIxNSB5ZWFycyIsbGFiZWxzID0gZGF0ZV9mb3JtYXQoIiVZIikgKSsgIAogIHRoZW1lX21pbmltYWwoKQoKCmdnc2F2ZSgicGxvdHMvZ2RwX2luX2dvbGRfZWRhLlBORyIsIGRwaSA9IDMwMCwgd2lkdGggPSAxMCxoZWlnaHQgPSA2KQpgYGAKCkxhIGd1ZXJyYSBkZSBzZXNlc2nDs24gZGUgRUVVVSBmdcOpIGVudHJlIGVsIDEyIGRlIGFicmlsIGRlIDE4NjEgeSBlbCA5IGRlIGFicmlsIGRlIDE4NjUgCgpBIHBhcnRpciBkZSBhaMOtIGVsIHBiaSBlbiBvcm8gY3JlY2UgaGFzdGEgZWwgZmluIGRlbCBwYXRyb24gb3JvLgoKIyMgd2FnZQoKYGBge3J9CndhZ2UgJT4lIAogIHN1bW1hcnkoKQpgYGAKClBvZGVtb3MgZGVmbGFjdGFyIGVsIHNhbGFyaW8gaG9yYXJpbyBwb3IgZWwgQ1BJCgpgYGB7cn0KZ2dwbG90bHkoCndhZ2UgJT4lIAogIGxlZnRfam9pbihjcGksYnk9IlllYXIiKSAlPiUgCiAgbmEub21pdCgpICU+JSAKICBtdXRhdGUoc2FsYXJpb19ob3JhcmlvX3JlYWwgPSBgUHJvZHVjdGlvbiBXb3JrZXJzIEhvdXJseSBDb21wZW5zYXRpb24gKG5vbWluYWwgZG9sbGFycylgL2BVLlMuIENvbnN1bWVyIFByaWNlIEluZGV4ICpgKSAlPiUgCiAgZ2dwbG90KC4sYWVzKFllYXIsc2FsYXJpb19ob3JhcmlvX3JlYWwpKSsKICBnZW9tX2xpbmUoKSAKICApCmBgYAoKCkVsIHNhbGFyaW8gcmVhbCB0aWVuZSB1bmEgdGVuZGVuY2lhIGNyZWNpZW50ZSBoYXN0YSBlbCA3OCcgeSBhbGzDrSBzZSBlc3RhbmNhIGhhc3RhIGVsIDIwMTMKCgoKYGBge3J9CndnX2dvbGQgPC0gd2FnZSAlPiUgCiAgZmlsdGVyKFllYXI+PTE5MDApICU+JSAKICBsZWZ0X2pvaW4oZ29sZCwgZ2RwLCBieSA9ICJZZWFyIikgJT4lIAogIG11dGF0ZSh3Z19pbl9nb2xkID0gYFByb2R1Y3Rpb24gV29ya2VycyBIb3VybHkgQ29tcGVuc2F0aW9uIChub21pbmFsIGRvbGxhcnMpYC9gTmV3IFlvcmsgTWFya2V0IFByaWNlIChVLlMuIGRvbGxhcnMgcGVyIGZpbmUgb3VuY2UpYCwKICAgICAgICAgWWVhciA9IHBhcnNlX2RhdGVfdGltZShZZWFyLCJ5IikpICU+JSAKICBuYS5vbWl0KCkgIApnZ3Bsb3QoKSsKZ2VvbV9yZWN0KGRhdGE9IGNyaXNpc19sYXJnYXMsIAogICAgICAgICAgICBhZXMoeG1pbj1jcmlzaXNfbGFyZ2FzJGRlc2RlLAogICAgICAgICAgICB4bWF4PWNyaXNpc19sYXJnYXMkaGFzdGEpLAogICAgICAgICAgICBmaWxsPSJmaXJlYnJpY2siLCAKICAgICAgICAgICAgeW1pbj0tSW5mLAogICAgICAgICAgICB5bWF4PUluZiwKICAgICAgICAgICAgYWxwaGE9MC41KSsKICBnZW9tX2xpbmUoc2l6ZT0xLGRhdGEgPSB3Z19nb2xkLCBhZXMoWWVhciwgd2dfaW5fZ29sZCkpKwogIGdlb21fdmxpbmUoZGF0YT1jcmlzaXNfcHVudHVhbGVzLCBhZXMoeGludGVyY2VwdD1kZXNkZSksIGNvbG9yID0gInJlZCIsIGxpbmV0eXBlPSJkYXNoZWQiKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBwYXJzZV9kYXRlX3RpbWUoMTk3MSwieSIpLGNvbG9yID0gImdvbGQiKSsgI2ZpbiBkZWwgcGF0cm9uIG9ybwogIHNjYWxlX3hfZGF0ZXRpbWUoZGF0ZV9icmVha3MgPSAiMTUgeWVhcnMiLGxhYmVscyA9IGRhdGVfZm9ybWF0KCIlWSIpICkrCiAgdGhlbWVfbWluaW1hbCgpCgoKZ2dzYXZlKCJwbG90cy93Z19pbl9nb2xkX2VkYS5QTkciLCBkcGkgPSAzMDAsIHdpZHRoID0gMTAsaGVpZ2h0ID0gNikKCmBgYAoKU2UgdmVuIGxvcyBtaXNtb3MgdHJlcyBwZXLDrW9kb3MuIFBlcm8gYSBkaWZlcmVuY2lhIGRlbCBHRFAsIGVsIHBlcsOtb2RvIDE5ODAtMjAxMiB0aWVuZSB1biBuaXZlbCBtw6FzIGJham8gcXVlIGVsIGFudGVyaW9yLiAKIAoKwr8gU2kgcXVpc2llcmFtb3MgY29tcGFyYXIgaW5ncnNvcyBjb24gYWxnw7puIHJldmVudWUgdGVuZHLDrWFtb3MgdXNhciBTJlAgbyBESkE/CgoKCg==